﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

/*
* 1.两个匹配的字符串，必须完全匹配，匹配个数==字符串长度；
* 2.如果匹配一个字符串src，需要记录被匹配字符串dest地址；
* 3.如果匹配一半未成功，回到记录被匹配字符串地址dest+1；
* 4.如果要匹配的被匹配字符串dest的结束，匹配个数count不等于字符串src长度；
*/
char* MyStrstr(char* dest, char* src)
{
	//int i = 0;
	//int j = 0;
	//11.匹配到的字符个数；
	//int count = 0;
	char* p = NULL;
	//int len = strlen(src);
	char* temp = src;

	//12.dest[i]='\0'时，则为假，就不能执行下去了。即*dest不能为'\0'，*dest必须为真时才能执行下去。和a=0-->a为假,if(真)-->if(!a)一样。
	//while (dest[i] != '\0')
	while (*dest)
	{
		//p = &dest[i];
		p = dest;
		//if(dest[i]==src[j])
		//while (dest[i] == src[j])
		while (*dest == *temp)
		{
			//7.此时count=0，并不是count的值为0，而是说count为假。!count为真，if(真)才会执行，而if(假)是不会执行的。
				//而此时count=0，if(!count)==if(1)==if(真),就会执行下面的语句。当count=1时，即count为真，if(!count)==if(0)==if(假)，自然不会继续往下执行了。
				//害，主要还是因为c语言没有布尔类型罢了，只能用0和1来替代，但是if()里面的0和1，有不是值，而是真假，真是扯淡啊。
			//if (!count)
				//8.如果dest的字符匹配成功src的第一个字符，就记录下dest[i]的位置；
				//p = &dest[i];
			//count++;
			//i++;
			//j++;
			dest++;
			temp++;
		}
		//9.匹配的个数==字符串src的长度，则匹配成功；
		//if (count == len)
		//if (*src == '\0')
		if (!*temp)
			return p;
		else
			temp = src;
		//10.如果此时dest为hellllo world，src不变llo，则上面的i为4，即dest[4]时跳出while循环；i=4,j=2,count=2;
			//发生改变的值，i,j,count,p。p的地址还是&dest[2];要继续比的话，就要i从3开始；
		//i = i - count + 1;
		//j = 0;
		//count = 0;
		dest = p;
		dest++;
	}

	return NULL;
}

//main94：案例：指针实现自定义字符串查找字符串mystrstr函数
int main94()
{
	char* p = strstr("hello world", "llo");
	printf("5.使用strstr函数查找llo在hello world中的位置，并由此开头输出接下来的字符串：%s\n", p);//llo world

	//char* pM = MyStrstr("hello world", "llo");//llo world
	//char* pM = MyStrstr("hellllo world", "llo");//llo world
	//char* pM = MyStrstr("hellll worldll", "llo");//null
	//char* pM = MyStrstr("  \0llo llo llo", "llo");//null
	//char* pM = MyStrstr("  ll llo llo", "llo");//llo llo
	//char* pM = MyStrstr("  ll llo llo", "l");//ll llo llo
	char* pM = MyStrstr("  ll llo llo", " ");//  ll llo llo
	printf("6.使用自定义MyStrstr函数查询llo在hello world中位置，并从位置起始处地址输出字符串：%s\n", pM);//llo world -->   ll llo llo

	system("pause");
	return EXIT_SUCCESS;
}